/*
 * Copyright (c) 2013, SRI International
 * All rights reserved.
 * Licensed under the The BSD 3-Clause License;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 * 
 * http://opensource.org/licenses/BSD-3-Clause
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 
 * Neither the name of the aic-web-praise nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.sri.ai.lpitools.executionengine.server.implementations;

import java.net.MalformedURLException;
import java.util.UUID;

import org.apache.xmlrpc.XmlRpcException;
import org.json.simple.parser.ParseException;

import com.google.gson.Gson;
import com.sri.ai.lpitools.cobra.gwtutil.dataobjects.shared.QueryOptionsGWT;
import com.sri.ai.lpitools.executionengine.server.api.ExecutionEngineServer;
import com.sri.ai.lpitools.executionengine.server.callback.CallBackClientImpl;
import com.sri.ai.lpitools.executionengine.server.callback.CallBackClient_Interface;
import com.sri.ai.lpitools.executionengine.server.components.processor.ModelProcessor;
import com.sri.ai.lpitools.executionengine.server.components.processor.ServerLBPQueryEngine;
import com.sri.ai.praise.PRAiSEConfiguration;
import com.sri.ai.praise.lbp.LBPQueryEngine.QueryOptions;

public class ExecutionEngineServerWrapper implements ExecutionEngineServer {
	private static boolean running = false;
	
	public ExecutionEngineServerWrapper(){
		//override the default to use our query engine with output reformatter
		System.setProperty(PRAiSEConfiguration.KEY_LBP_QUERY_ENGINE_CLASS, ServerLBPQueryEngine.class.getName());
		ExecutionEngineServerWrapper.setRunning(true);
	}
	
	/*
	 * (non-Javadoc)
	 * @see com.sri.ai.lpitools.executionengine.server.api.ExecutionEngineServer#checkModelByModel(java.lang.String, java.lang.String)
	 */
	@Override
	public String checkModelByModel(String model) throws XmlRpcException {

		ModelProcessor checker = new ModelProcessor();
		String result = "Error";
		try {
			result = checker.checkModel(model);
			return result;
		} catch (ParseException e) {
			throw new XmlRpcException("Error with checkModelByModel, " + e.getMessage());
		}		
		
	}
	

	/*
	 * (non-Javadoc)
	 * @see com.sri.ai.lpitools.executionengine.server.api.ExecutionEngineServer#runQueryByKey(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	 */
	@Override
	public String runQueryByKey(String user, String model, String evidenceKey, String query, String clientID, String queryOptionsJSON, String url) throws XmlRpcException {
		CallBackClient_Interface client = null;
		try {

			client = new CallBackClientImpl(url);
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		}

		ModelProcessor processor = new ModelProcessor();
		
		Gson gson = new Gson();
		QueryOptionsGWT queryOptionsGWT = gson.fromJson(queryOptionsJSON, QueryOptionsGWT.class);
		
		QueryOptions queryOptions = new QueryOptions(
				queryOptionsGWT.getKnownDomainSizes(),
				queryOptionsGWT.getTraceOn(),
				queryOptionsGWT.getJustificationsOn());
		
		String result = "Error";

		try {
			result = processor.runQuery(user, model, evidenceKey, query, queryOptions, client, clientID);
			return result;
		} catch (ParseException e) {
			throw new XmlRpcException("Error with runQueryByKey, " + e.getMessage());
		}	
		
	}
	
	/*
	 * (non-Javadoc)
	 * @see com.sri.ai.lpitools.executionengine.server.api.ExecutionEngineServer#getUniqueID()
	 */
	@Override
	public String getUniqueID() {
		UUID idOne = UUID.randomUUID();
		return idOne.toString();
	}

	/**
	 * @return the running
	 */
	public static boolean isRunning() {
		return running;
	}

	/**
	 * @param running the running to set
	 */
	public static void setRunning(boolean running) {
		ExecutionEngineServerWrapper.running = running;
	}

}
